# -------------------------------------------------------------
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
# -------------------------------------------------------------

# Autogenerated By   : src/main/python/generator/generator.py
# Autogenerated From : scripts/builtin/scale.dml

from typing import Dict, Iterable

from systemds.operator import OperationNode, Matrix, Frame, List, MultiReturn, Scalar
from systemds.utils.consts import VALID_INPUT_TYPES


def scale(X: Matrix,
          **kwargs: Dict[str, VALID_INPUT_TYPES]):
    """
     This function scales and center individual features in the input
     matrix (column wise.) using z-score to scale the values.
     The transformation is sometimes also called scale and shift,
     but it is shifted first and then subsequently scaled.
    
     The method is not resistant to inputs containing NaN nor overflows
     of doubles, but handle it by guaranteeing that no extra NaN values
     are introduced and columns that contain NaN will not be scaled or shifted.
    
    
    
    :param X: Input feature matrix
    :param center: Indicates to center the feature matrix
    :param scale: Indicates to scale the feature matrix according to z-score
    :return: Output feature matrix scaled and shifted
    :return: The column means of the input, subtracted if Center was TRUE
    :return: The scaling of the values, to make each dimension have similar value ranges
    """

    params_dict = {'X': X}
    params_dict.update(kwargs)
    
    vX_0 = Matrix(X.sds_context, '')
    vX_1 = Matrix(X.sds_context, '')
    vX_2 = Matrix(X.sds_context, '')
    output_nodes = [vX_0, vX_1, vX_2, ]

    op = MultiReturn(X.sds_context, 'scale', output_nodes, named_input_nodes=params_dict)

    vX_0._unnamed_input_nodes = [op]
    vX_1._unnamed_input_nodes = [op]
    vX_2._unnamed_input_nodes = [op]

    return op
